import ora from 'ora';

class SpinnerWrapper {
    constructor(options = {}) {
        this.spinnerOptions = {
            text: options.text || '正在处理...',
            color: options.color || 'blue',
            ...options,
        };
        this.spinner = null;
    }

    start(text = this.spinnerOptions.text) {
        if (!this.spinner) {
            this.spinner = ora(this.spinnerOptions);
        }
        this.spinner.start(text);
    }

    succeed(text = '操作成功!') {
        if (this.spinner) {
            this.spinner.succeed(text);
            this.stop();
        }
    }

    fail(text = '操作失败!') {
        if (this.spinner) {
            this.spinner.fail(text);
            this.stop();
        }
    }

    stop() {
        if (this.spinner) {
            this.spinner.stop();
            this.spinner = null;
        }
    }

    // 用于处理异步操作并自动管理spinner的生命周期,接受额外的参数
    async runTask(taskFn, ...args) {
        this.start();
        try {
            const result = await taskFn(...args); // 通过扩展运算符传递参数
            this.succeed();
            return result;
        } catch (error) {
            this.fail();
            throw error; // 重新抛出错误以便于外部处理
        } finally {
            // 确保spinner在finally块中被清理，以防taskFn内部有未被捕获的异常
            this.stop();
        }
    }

    // 添加一个方法来处理单个任务的spinner
    async withTask(taskName, taskFn, ...args) {
        const taskSpinner = ora({ text: `正在处理: ${taskName}`, color: 'green' });
        taskSpinner.start();
        try {
            await taskFn(...args);
            taskSpinner.succeed();
        } catch (error) {
            taskSpinner.fail();
            throw error; // 抛出错误让外层处理
        } finally {
            // 这里通常不需要，因为succeed或fail已经停止了spinner，但作为兜底可以保留
            taskSpinner.stop();
        }
    }
}

export default SpinnerWrapper;
